﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using App.Interface;
using AutoMapper;
using Domain.Entidades;
using PagedList;
using SiteCredivale.ViewModels;



namespace SiteCredivale.Areas.Intranet.Controllers
{
    public class NoticiasController : Controller
    {

        private readonly IUsuarioAppService _usuarioapp;
        private readonly IVW_noticiasAppService _noticiaapp;


        public NoticiasController()
        {

        }
        public NoticiasController(IUsuarioAppService usuarioapp, IVW_noticiasAppService noticiaapp)
        {
            _usuarioapp = usuarioapp;
            _noticiaapp = noticiaapp;
        }
        public ActionResult Inserir()
        {
            try
            {

                if (_usuarioapp.verifica_permissao(2106) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Noticias");
                }


                var model = new noticiaViewModel();
                return View(model);

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
        [Authorize,HttpPost,ValidateInput(false)]
        public ActionResult Inserir(noticiaViewModel not)
        {
            try
            {




                if (not == null)
                {
                    ModelState.AddModelError("","Por favor preencha todos os campos corretamente");

                }
                else
                {
                    if (not.not_titulo.Length < 5 || not.not_titulo.Length > 250)
                    {
                        ModelState.AddModelError("not_titulo", "O título deve contér entre 5 a 250 caracteres");
                    }
                    if (not.not_desc == "" || not.not_desc==null)
                    {
                        ModelState.AddModelError("not_desc", "Algum contúdo é obrigatório");
                    }

                }

                if (ModelState.IsValid)
                {
                  

                    _noticiaapp.Inserir(Mapper.Map<noticiaViewModel, noticia>(not));
                    ViewBag.res = "Notícia cadastrada com sucesso !";
                    not = null;
                    ModelState.Clear();

                }

                return View(not);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao inserir a notícia : " + ex.Message + ",contate o administrador";
                throw ex;
            }
           

        }
        [Authorize]
        public ActionResult Lista(int? page, string dt1, string dt2)
        {

            try
            {

                if (_usuarioapp.verifica_permissao(2112) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }


                return RedirectToAction("Manutencao", "Noticias");




            }
            catch (Exception ex)
            {

                throw ex;
            }
           
        }
        [Authorize]
        public ActionResult Manutencao(int? page, string dt1, string dt2)
        {

            try
            {



                if (_usuarioapp.verifica_permissao(2112) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(dt1, out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-3);
                }

                if (DateTime.TryParse(dt2, out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();

                const int pageSize = 15;


                var pagednoticias = _noticiaapp.busca_noticias(data1, data2).ToPagedList(page ?? 1, pageSize);
                return View(pagednoticias);




            }
            catch (Exception ex)
            {

                throw ex;
            }
          
          
        }
        [Authorize, HttpPost]
        public ActionResult Manutencao(string calendario1, string calendario2)
        {

            try
            {

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(calendario1, out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-3);
                }

                if (DateTime.TryParse(calendario2, out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();

                const int pageSize = 15;
                var pagednoticias = _noticiaapp.busca_noticias(data1, data2).ToPagedList(1, pageSize);
                return View(pagednoticias);




            }
            catch (Exception ex)
            {

                throw ex;
            }
          
        }
        public ActionResult Browse(string CKEditorFuncNum)
        {
            List<FileInformation> fileInfoList = GetCurrentFiles();

            var model = new FileListingViewModel
            {
                Files = fileInfoList,
                CKEditorFuncNum = CKEditorFuncNum
            };

            return View(model);
        }
        public ActionResult Upload(HttpPostedFileBase upload, string CKEditorFuncNum, string CKEditor, string langCode)
        {
            string fileName = upload.FileName;

            string basePath = Server.MapPath("~/Uploads/Noticias");
            upload.SaveAs(basePath + "\\" + fileName);

            return View();
        }
        private List<FileInformation> GetCurrentFiles()
        {
            string basePath = Server.MapPath("~/Uploads/Noticias");

            List<FileInformation> fileInfoList = new List<FileInformation>();

            string[] files = Directory.GetFiles(basePath);

            files.ToList().ForEach(file =>
            {
                fileInfoList.Add(new FileInformation { FileName = Path.GetFileName(file) });
            });
            return fileInfoList;
        }
        public ActionResult Deletar(string codigo, string dt1, string dt2, string pagina)
        {
            try
            {

                if (_usuarioapp.verifica_permissao(2108) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Noticias");
                }

   
               
                _noticiaapp.deletar(int.Parse(codigo));
                return RedirectToAction("Manutencao", "Noticias", new { page = int.Parse(pagina),dt1 = dt1, dt2 = dt2 });

            }
            catch (Exception ex)
            {
                TempData["msg_err"] = "Erro ao deletar a notícia: " + ex.Message + ",contate o administrador";
                throw ex;
            }
          


        }
        [Authorize]
        public ActionResult Editar(int codigo)
        {
            try
            {

                if (_usuarioapp.verifica_permissao(2107) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Noticias");
                }




                return View(Mapper.Map<noticia, noticiaViewModel>(_noticiaapp.carrega_busca(codigo)));


            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
        [HttpPost, Authorize, ValidateInput(false)]
        public ActionResult Editar(noticiaViewModel not)
        {
            try
            {



                if (not.not_titulo.Length < 5 || not.not_titulo.Length > 250)
                {
                    ModelState.AddModelError("not_titulo", "O título deve contér entre 5 a 250 caracteres");
                }
                if (not.not_desc == "")
                {
                    ModelState.AddModelError("not_desc", "Algum contúdo é obrigatório");
                }



                if (ModelState.IsValid)
                {

                    _noticiaapp.Editar(Mapper.Map<noticiaViewModel, noticia>(not));
                    
                        ViewBag.res = "Notícia atualizada com sucesso !";
                   

                }

                return View(not);

            }
            catch (Exception ex)
            {
                ViewBag.err= "Erro ao alterar a notícia: " + ex.Message + ",contate o administrador";
                return View(not);
            }
           

        }


    }
}
